package demo08CollectionFramework;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User:咭咭熊
 * Date:2021 - 10 - 09
 * Time:15:52
 */


/**
 * 1.泛型：只存在于编译时期  只是编译时期
 *  2.泛型的意义：
 *    （1）自动进行类型的检查
 *    （2）自动进行类型转换
 *
 *  3.泛型 在 编译的时候  并不会进行指定类型的替换 而是拿着指定的类型进行检查
 *     即在编译的时候 ，拿着你指定的类型 进行 类型检查
 *
 *  4.编译的时候 会进行类型擦除，编译的时候 编译都会把泛型擦除为Object，不是替换为Object
 *
 *  5.class MyArrayList<T> {  <T>：代表占位符  表示当前这个类是一个泛型类
 *
 *  6.简单类型不能做泛型类型的参数
 *       MyArrayList<Integer> myArrayList1 = new MyArrayList<>();
 *  7. 不能new 泛型类型的数组  【错误的用法：this.elem = new T[10];】this.elem = (T[])new Object[10];
 *  8. 泛型类型的参数 不参与类型的组成  ---> 泛型就是在编译时期的一种机制；
 *
 */

//题目：写一个通用的顺序表？
// Object是所有类的父类，哪怕这个类没有继承Object
class MyArrayList <T> {
    public T[] elem;
    public int usedSize;

    public MyArrayList() {
        //this.elem = new T[10];
        this.elem = (T[])new Object[10];
    }

    public void add(T data) {
        this.elem[this.usedSize] = data;
        this.usedSize++;
    }

    public T get(int pos) {
        return this.elem[pos];
    }

}
class Person {

}


public class TestGeneric {
    /***
     * 7.选择题
     * 分析：由于底层的valueOf()方法【其中low = -128;high = 127】
     * public static Integer valueOf(int i){
     *     if(i > = IntegerCache.low && i <= IntegerCache.high){
     *         retrun IntegerCache.cache[i + (-IntegerCache.low)];
     *      retrun new Integer(i);
     *     }
     * }
     * * @param args
     */
    public static void main(String[] args) {
        Integer a = 128;
        Integer b = 128;
        System.out.println(a == b);//false

        Integer c = 100;
        Integer d = 100;
        System.out.println(c == d);//true
    }
    /***
     * 6.显示的拆箱
     * @param args
     */
    public static void main6(String[] args) {
        Integer i = 10;
        int a1 = i;
        System.out.println(a1);//自动拆箱

        //显示的拆箱
        int a2 = i.intValue();
        System.out.println(a2);

        double d = i.doubleValue();
        System.out.println(d);
    }

    /***
     * 5.
     *   （1）装包（装箱）：将简单类型   包装成 对应的 包装类
     *   （2）拆包（拆箱）：将包装类型 拆成  对应的 简单类型
     * @param args
     */
    public static void main5(String[] args) {
        int a = 10;
        Integer integer1 = new Integer(a);//显示的装包【将简单类型 包装成 对应的包装类】
        System.out.println(integer1);

        Integer integer2 = Integer.valueOf(a);//显示装包
        System.out.println(integer2);

        Integer integer3 = a;//自动装包
    }


    /***
     * 4.泛型只发生在编译时期
     * @param args
     */
    public static void main4(String[] args) {
        Person person = new Person();
        System.out.println(person);//demo08CollectionFramework.Person@1b6d3586

        MyArrayList<String> myArrayList1 = new MyArrayList<>();
        System.out.println(myArrayList1);//demo08CollectionFramework.MyArrayList@4554617c

        MyArrayList<Integer> myArrayList2 = new MyArrayList<>();
        System.out.println(myArrayList2);//demo08CollectionFramework.MyArrayList@74a14482

        MyArrayList<Double>  myArrayList3 = new MyArrayList<>();
        System.out.println(myArrayList3);
    }

    public static void main3(String[] args) {
        MyArrayList<Integer> myArrayList2 = new MyArrayList<>();
        MyArrayList<Double>  myArrayList3 = new MyArrayList<>();
        MyArrayList<String> myArrayList1 = new MyArrayList<>();
        myArrayList1.add("fsfsa");
        myArrayList1.add("gaobo");
        myArrayList1.add("hahah");
        String str = myArrayList1.get(2);
        System.out.println(str);
    }

    public static void main1(String[] args) {
        MyArrayList<String> myArrayList1 = new MyArrayList<>();
        myArrayList1.add("fsfsa");
        myArrayList1.add("gaobo");
        myArrayList1.add("hahha");

        String str = myArrayList1.get(2);
        System.out.println(str);

        MyArrayList<Integer> myArrayList2 = new MyArrayList<>();

        myArrayList2.add(1);
        myArrayList2.add(2);

        int val = myArrayList2.get(1);
        System.out.println(val);


        MyArrayList<Double> myArrayList3 = new MyArrayList<>();


        /*MyArrayList myArrayList = new MyArrayList();
        myArrayList.add(1);
        myArrayList.add(19.8);
        myArrayList.add("fsfsa");

        String str = (String) myArrayList.get(2);
        System.out.println(str);*/
    }
}

